#include "../inc/main.h"
#include "../inc/show_bmp.h"
#include "../inc/touch.h"
#include "../inc/draw_white.h"
#include "../inc/show_time.h"
#include "../inc/displayText.h"
#include "../inc/queue.h"

int main()
{

    // 显示时间创建线程
    pthread_t time_thread;
    pthread_create(&time_thread, NULL, showTime, NULL);
    initLCD();

    // 神经内科患者队列===========================================
    // 定义一个队列和初始化
    PatientQueue queue1;
    PatientQueue Outqueue1;
    initQueue(&queue1);
    initQueue(&Outqueue1);
    Patient *pass1 = malloc(sizeof(Patient)); // 确保分配内存
    // 从文件加载患者信息
    loadPatientsFromFile(&queue1, "../res/txt/神经内科患者信息.txt");

    // 耳鼻喉科患者队列===========================================
    // 定义一个队列和初始化
    PatientQueue queue2;
    PatientQueue Outqueue2;
    initQueue(&queue2);
    initQueue(&Outqueue2);
    Patient *pass2 = malloc(sizeof(Patient)); // 确保分配内存
    // 从文件加载患者信息
    loadPatientsFromFile(&queue2, "../res/txt/耳鼻喉科患者信息.txt");

    // 皮肤科患者队列===========================================
    // 定义一个队列和初始化
    PatientQueue queue3;
    PatientQueue Outqueue3;
    initQueue(&queue3);
    initQueue(&Outqueue3);
    Patient *pass3 = malloc(sizeof(Patient)); // 确保分配内存
    // 从文件加载患者信息
    loadPatientsFromFile(&queue3, "../res/txt/皮肤科患者信息.txt");

    int x = -1, y = -1; // 初始值是-1
    int J = 'A';
    while (1)
    {
        switch (J)
        {
        // 科室选择==================================================
        case 'A':
            show_bmp("../res/bmp/科室选择.bmp", 0, 0);
            while (1)
            {
                get_touch_pos(&x, &y);
                // 神经内科监听
                if ((x > 430) && (x < 744) && (y > 82) && (y < 176))
                {
                    J = '1';
                    x = -1, y = -1;
                    break;
                }
                // 耳鼻喉科监听
                if ((x > 430) && (x < 744) && (y > 197) && (y < 290))
                {
                    J = '2';
                    x = -1, y = -1;
                    break;
                }
                // 皮肤科监听
                if ((x > 430) && (x < 744) && (y > 313) && (y < 404))
                {
                    J = '3';
                    x = -1, y = -1;
                    break;
                }
                // 关机按钮监听
                if ((x > 0) && (x < 71) && (y > 406) && (y < 480))
                {
                    stop_thread(time_thread);
                    show_bmp("../res/bmp/黑屏.bmp", 0, 0);
                    return 0;
                }
            }
            break;
        // 神经内科===================================================
        case '1':
            show_bmp("../res/bmp/神经内科诊室.bmp", 0, 0);
            while (1)
            {
                // 显示神经内科诊室
                // 患者队列以及就诊候诊===========================================
                // 就诊区========================================================
                if (queue1.front != NULL)
                    displayText(queue1.front->name, 36, 200, 45, 300, 130, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 300, 130);
                // 过号区========================================================
                if (Outqueue1.front != NULL)
                    displayText(Outqueue1.rear->name, 36, 200, 45, 300, 297, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 300, 297);
                if (Outqueue1.count >= 2)
                    displayText(Outqueue1.rear->prev->name, 36, 200, 45, 300, 366, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 300, 366);
                // 候诊区 1-4 ========================================================
                // 1========================================================
                if (queue1.count >= 2)
                    displayText(queue1.front->next->name, 36, 200, 45, 540, 170, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 170);
                // 2========================================================
                if (queue1.count >= 3)
                    displayText(queue1.front->next->next->name, 36, 200, 45, 540, 235, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 235);
                // 3========================================================
                if (queue1.count >= 4)
                    displayText(queue1.front->next->next->next->name, 36, 200, 45, 540, 300, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 300);
                // 4========================================================
                if (queue1.count >= 5)
                    displayText(queue1.front->next->next->next->next->name, 36, 200, 45, 540, 368, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 368);
                // 循环监听坐标========================================================
                get_touch_pos(&x, &y);
                // 就诊按钮监听============================================
                if ((x > 228) && (x < 368) && (y > 228) && (y < 290))
                {
                    dequeue(&queue1);
                }
                // 过号按钮监听=============================================
                if ((x > 370) && (x < 508) && (y > 228) && (y < 288))
                {
                    if (pass1 == NULL)
                    {
                        printf("Memory allocation failed\n");
                        exit(1);
                    }
                    // 过号逻辑
                    if (!isEmpty(&queue1))
                    {
                        // 从主队列中出队并入队到过号队列
                        pass1 = dequeue(&queue1);
                        enqueue(&Outqueue1, pass1);
                    }
                    else
                    {
                        printf("Queue is empty\n");
                    }
                }

                // 医生信息跳转触控监听=============================================
                if ((x > 20) && (x < 200) && (y > 86) && (y < 426))
                {
                    J = 'B';
                    x = -1, y = -1;
                    break;
                }
                // 返回按钮监听
                if ((x > 714) && (x < 800) && (y > 432) && (y < 480))
                {
                    J = 'A';
                    x = -1, y = -1;
                    break;
                }
            }
            break;
        // 医生信息界面
        case 'B':
            show_bmp("../res/bmp/doctorbackground.bmp", 0, 0);
            while (1)
            {
                // 显示医生简介
                displayText(read_file("../res/txt/王毅医生信息.txt"), 25, 390, 350, 365, 88, 0, 5, 0, 0, 0, 385);
                // 显示医生头像
                show_bmp("../res/bmp/王毅医生半身照.bmp", 3, 112);

                get_touch_pos(&x, &y);

                // 返回监听
                if ((x > 0) && (x < 800) && (y > 0) && (y < 480))
                {
                    J = '1';
                    x = -1, y = -1;
                    break;
                }
            }
            break;
        // 耳鼻喉科===================================================
        case '2':
            show_bmp("../res/bmp/耳鼻喉科诊室.bmp", 0, 0);
            while (1)
            {
                // 显示耳鼻喉科诊室
                // 患者队列以及就诊候诊===========================================
                // 就诊区========================================================
                if (queue2.front != NULL)
                    displayText(queue2.front->name, 36, 200, 45, 300, 130, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 300, 130);
                // 过号区========================================================
                if (Outqueue2.front != NULL)
                    displayText(Outqueue2.rear->name, 36, 200, 45, 300, 297, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 300, 297);
                if (Outqueue2.count >= 2)
                    displayText(Outqueue2.rear->prev->name, 36, 200, 45, 300, 366, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 300, 366);
                // 候诊区 1-4 ========================================================
                // 1========================================================
                if (queue2.count >= 2)
                    displayText(queue2.front->next->name, 36, 200, 45, 540, 170, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 170);
                // 2========================================================
                if (queue2.count >= 3)
                    displayText(queue2.front->next->next->name, 36, 200, 45, 540, 235, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 235);
                // 3========================================================
                if (queue2.count >= 4)
                    displayText(queue2.front->next->next->next->name, 36, 200, 45, 540, 300, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 300);
                // 4========================================================
                if (queue2.count >= 5)
                    displayText(queue2.front->next->next->next->next->name, 36, 200, 45, 540, 368, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 368);
                // 循环监听坐标========================================================
                get_touch_pos(&x, &y);
                // 就诊按钮监听============================================
                if ((x > 228) && (x < 368) && (y > 228) && (y < 290))
                {
                    dequeue(&queue2);
                }
                // 过号按钮监听=============================================
                if ((x > 370) && (x < 508) && (y > 228) && (y < 288))
                {
                    if (pass2 == NULL)
                    {
                        printf("Memory allocation failed\n");
                        exit(1);
                    }
                    // 过号逻辑
                    if (!isEmpty(&queue2))
                    {
                        // 从主队列中出队并入队到过号队列
                        pass2 = dequeue(&queue2);
                        enqueue(&Outqueue2, pass2);
                    }
                    else
                    {
                        printf("Queue is empty\n");
                    }
                }
                // ===================================================================
                // 医生信息监听
                if ((x > 20) && (x < 200) && (y > 86) && (y < 426))
                {
                    J = 'C';
                    x = -1, y = -1;
                    break;
                }
                // 返回按钮监听
                if ((x > 714) && (x < 800) && (y > 432) && (y < 480))
                {
                    J = 'A';
                    x = -1, y = -1;
                    break;
                }
            }
            break;
        // 医生信息界面
        case 'C':
            show_bmp("../res/bmp/doctorbackground.bmp", 0, 0);
            while (1)
            {
                // 显示医生简介
                displayText(read_file("../res/txt/顾魏医生信息.txt"), 25, 390, 350, 365, 88, 0, 5, 0, 0, 0, 385);
                // 显示医生头像
                show_bmp("../res/bmp/顾魏医生半身照.bmp", 3, 112);

                get_touch_pos(&x, &y);

                // 返回监听
                if ((x > 0) && (x < 800) && (y > 0) && (y < 480))
                {
                    J = '2';
                    x = -1, y = -1;
                    break;
                }
            }
            break;
        // 皮肤科=======================================================
        case '3':
            show_bmp("../res/bmp/皮肤科诊室.bmp", 0, 0);
            while (1)
            {
                // 显示皮肤科诊室
                // 患者队列以及就诊候诊==============================================
                // 就诊区========================================================
                if (queue3.front != NULL)
                    displayText(queue3.front->name, 36, 200, 45, 300, 130, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 300, 130);
                // 过号区========================================================
                if (Outqueue3.front != NULL)
                    displayText(Outqueue3.rear->name, 36, 200, 45, 300, 297, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 300, 297);
                if (Outqueue3.count >= 2)
                    displayText(Outqueue3.rear->prev->name, 36, 200, 45, 300, 366, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 300, 366);
                // 候诊区 1-4 ========================================================
                // 1========================================================
                if (queue3.count >= 2)
                    displayText(queue3.front->next->name, 36, 200, 45, 540, 170, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 170);
                // 2========================================================
                if (queue3.count >= 3)
                    displayText(queue3.front->next->next->name, 36, 200, 45, 540, 235, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 235);
                // 3========================================================
                if (queue3.count >= 4)
                    displayText(queue3.front->next->next->next->name, 36, 200, 45, 540, 300, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 300);
                // 4========================================================
                if (queue3.count >= 5)
                    displayText(queue3.front->next->next->next->next->name, 36, 200, 45, 540, 368, 0, 5, 255, 0, 0, 200);
                else
                    draw(200, 45, 540, 368);
                // 循环监听坐标========================================================
                get_touch_pos(&x, &y);
                // 就诊按钮监听============================================
                if ((x > 228) && (x < 368) && (y > 228) && (y < 290))
                {
                    dequeue(&queue3);
                }
                // 过号按钮监听=============================================
                if ((x > 370) && (x < 508) && (y > 228) && (y < 288))
                {
                    if (pass3 == NULL)
                    {
                        printf("Memory allocation failed\n");
                        exit(1);
                    }
                    // 过号逻辑
                    if (!isEmpty(&queue3))
                    {
                        // 从主队列中出队并入队到过号队列
                        pass3 = dequeue(&queue3);
                        enqueue(&Outqueue3, pass3);
                    }
                    else
                    {
                        printf("Queue is empty\n");
                    }
                }
                // ========================================================================
                // 医生信息监听
                if ((x > 20) && (x < 200) && (y > 86) && (y < 426))
                {
                    J = 'D';
                    x = -1, y = -1;
                    break;
                }
                // 返回按钮监听
                if ((x > 714) && (x < 800) && (y > 432) && (y < 480))
                {
                    J = 'A';
                    x = -1, y = -1;
                    break;
                }
                // usleep(100000);
            }
            break;
        // 医生信息界面
        case 'D':
            show_bmp("../res/bmp/doctorbackground.bmp", 0, 0);
            while (1)
            {
                // 显示医生简介
                displayText(read_file("../res/txt/常文举医生信息.txt"), 25, 390, 350, 365, 88, 0, 5, 0, 0, 0, 385);
                // 显示医生头像
                show_bmp("../res/bmp/常文举医生半身照.bmp", 3, 112);

                get_touch_pos(&x, &y);

                // 返回监听
                if ((x > 0) && (x < 800) && (y > 0) && (y < 480))
                {
                    J = '3';
                    x = -1, y = -1;
                    break;
                }
            }
        default:
            break;
        }
    }

    // 结束前释放队列内存
    free(pass1);
    freeQueue(&queue1);
    freeQueue(&Outqueue1);
    
    free(pass2);
    freeQueue(&queue2);
    freeQueue(&Outqueue2);

    free(pass3);
    freeQueue(&queue3);
    freeQueue(&Outqueue3);

    // 结束时间线程
    stop_thread(time_thread);

    return 0;
}
